batch size=2では動かない理由、ロス関数から考える
NLLLoss
現在のNLLLossへの入力は
input(モデルの出力が渡る): (5, 4)
5は系列長 → NLLLossにおけるN
minibatchは一度にクラスを予測するトークンの数(=系列長)と考えられる(5に揃えた)
C = 4(クラス数)
target(正解ラベル): (5)
値は0〜3(C未満)
N = 5, C = 4としてNLLLossを呼び出している
reductionがnoneでないので、scalarでlossが返る
👉batch_size=2でモデルを動かすとき
input
モデルから(5, 2, 4)のTensorが渡ってくる
(N,C,d1) K=1 に変形する
Nは系列長なので、5
Cが4
d1が2?
→ (5, 4, 2) に変形
target
DataLoaderから(2, 5)のTensorが渡ってくる
(N, d1) → (5, 2) に変形
中山さんの本ではkerasでsparse_categorical_crossentropyを指定
NLLLossだからbatch_size=1に限るということはなさそう
shapeを変えていくことで、batch_size=2でも動かせそう
動いたが、訓練できていない
残る疑問:ミニバッチ単位で勾配を更新するので、batch_size=2だと文ごとに勾配がクリアされない。これはOKなのか?
毎回勾配を更新すると計算時間がかかる → ミニバッチ学習 と聞いた記憶あり
loglossはcross entropyとも呼ばれる(『Kaggleで勝つデータ分析の技術』2.3.4)